package com.redepronik.negosysres.invfac.controller;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.redepronik.negosys.invfac.entity.Bodega;
import com.redepronik.negosys.invfac.entity.Grupo;
import com.redepronik.negosys.invfac.entity.Producto;
import com.redepronik.negosys.invfac.entityAux.KardexReporte;
import com.redepronik.negosys.invfac.service.BodegaService;
import com.redepronik.negosys.invfac.service.GrupoService;
import com.redepronik.negosys.invfac.service.KardexService;
import com.redepronik.negosys.invfac.service.ProductoService;

@Controller
@Scope("session")
public class KardexBean {

	@Autowired
	private ProductoService productoService;

	@Autowired
	private BodegaService bodegaService;

	@Autowired
	private KardexService kardexService;

	@Autowired
	private GrupoService grupoService;

	private List<KardexReporte> listaKardexReporte;

	private Producto producto;

	private Date fechaInicio;
	private Date fechaFinal;

	private List<Bodega> listaBodegas;
	private Bodega bodega;
	private boolean bnBodega;

	// //busqueda de productos principal
	private List<Producto> listaProductos;
	private List<Grupo> listaGrupos;
	private String criterioBusqueda;
	private Grupo grupo;

	// //

	public KardexBean() {
	}

	public void cargarKardex() {
		if (producto.getProductoid() == null || producto.getProductoid() == 0) {
			presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
					"MENSAJE DEL SISTEMA", "ESCOJA UN PRODUCTO"));
		} else if (bodega.getBodegaid() == null || bodega.getBodegaid() == 0) {
			presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
					"MENSAJE DEL SISTEMA", "ESCOJA UNA BODEGA"));
		} else {
			if (fechaInicio != null && fechaFinal != null
					&& fechaInicio.compareTo(fechaFinal) >= 0) {
				presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
						"MENSAJE DEL SISTEMA",
						"LA FECHA DE INICIO ES MAYOR A LA FECHA FINAL"));
			} else {
				listaKardexReporte = kardexService.generarkardex(producto,
						fechaInicio, fechaFinal, bodega);

				if (listaKardexReporte.isEmpty())
					presentaMensaje(new FacesMessage(
							FacesMessage.SEVERITY_ERROR, "MENSAJE DEL SISTEMA",
							"ESTE PRODUCTO NO TIENE KARDEX"));

				producto = new Producto();
				bodega = new Bodega();
				if (listaBodegas.size() == 1) {
					bodega = listaBodegas.get(0);
					bnBodega = true;
				}
				fechaFinal = null;
				fechaInicio = null;
			}
		}

	}

	public Bodega getBodega() {
		return bodega;
	}

	public String getCriterioBusqueda() {
		return criterioBusqueda;
	}

	public Date getFechaFinal() {
		return fechaFinal;
	}

	public Date getFechaInicio() {
		return fechaInicio;
	}

	public Grupo getGrupo() {
		return grupo;
	}

	public List<Bodega> getListaBodegas() {
		return listaBodegas;
	}

	public List<Grupo> getListaGrupos() {
		return listaGrupos;
	}

	public List<KardexReporte> getListaKardexReporte() {
		return listaKardexReporte;
	}

	public List<Producto> getListaProductos() {
		return listaProductos;
	}

	public Producto getProducto() {
		return producto;
	}

	@PostConstruct
	private void init() {
		listaBodegas = bodegaService.obtenerTodos();
		listaGrupos = grupoService.obtener();
		limpiarObjetos();
	}

	public boolean isBnBodega() {
		return bnBodega;
	}

	public void limpiarObjetos() {
		listaKardexReporte = new ArrayList<KardexReporte>();
		producto = new Producto();
		bodega = new Bodega();
		grupo = new Grupo();
		if (listaBodegas.size() == 1) {
			bodega = listaBodegas.get(0);
			bnBodega = true;
		}
	}

	public void obtenerProducto() {
		producto = productoService.obtenerPorProductoId(producto
				.getProductoid());
	}

	// // busqueda de productos
	public void obtenerProductos() {
		if (criterioBusqueda.compareToIgnoreCase("") == 0
				&& grupo.getGrupoid() == 0)
			presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
					"MENSAJE DEL SISTEMA", "INGRESE UN CRITERIO DE BÚSQUEDA"));
		else if (grupo.getGrupoid() != 0 || criterioBusqueda.length() >= 3) {
			setListaProductos(productoService.obtener(
					criterioBusqueda.toUpperCase(), grupo.getGrupoid()));
			criterioBusqueda = new String();
			grupo = new Grupo();
		} else
			presentaMensaje(new FacesMessage(FacesMessage.SEVERITY_ERROR,
					"MENSAJE DEL SISTEMA", "INGRESE MINIMO 3 CARACTERES"));

		criterioBusqueda = new String();
		grupo = new Grupo();
	}

	private void presentaMensaje(FacesMessage message) {
		FacesContext.getCurrentInstance().addMessage(null, message);
	}

	public void setBnBodega(boolean bnBodega) {
		this.bnBodega = bnBodega;
	}

	public void setBodega(Bodega bodega) {
		this.bodega = bodega;
	}

	public void setCriterioBusqueda(String criterioBusqueda) {
		this.criterioBusqueda = criterioBusqueda;
	}

	public void setFechaFinal(Date fechaFinal) {
		this.fechaFinal = fechaFinal;
	}

	public void setFechaInicio(Date fechaInicio) {
		this.fechaInicio = fechaInicio;
	}

	public void setGrupo(Grupo grupo) {
		this.grupo = grupo;
	}

	public void setListaBodegas(List<Bodega> listaBodegas) {
		this.listaBodegas = listaBodegas;
	}

	public void setListaGrupos(List<Grupo> listaGrupos) {
		this.listaGrupos = listaGrupos;
	}

	public void setListaKardexReporte(List<KardexReporte> listaKardexReporte) {
		this.listaKardexReporte = listaKardexReporte;
	}

	public void setListaProductos(List<Producto> listaProductos) {
		this.listaProductos = listaProductos;
	}

	public void setProducto(Producto producto) {
		this.producto = producto;
	}

}
